package dao;

import java.util.ArrayList;

import model.Competitie;
import model.Lid;
import model.Rekening;
import model.Team;
import model.Veld;
import model.Wedstrijd;
import model.interfaces.Artikel;
import model.interfaces.Lidmaatschap;
import model.lidmaatschap.Kind;
import model.lidmaatschap.Rustend;
import model.lidmaatschap.Volwassen;
import dao.interfaces.ClubhuisDao;
import dao.interfaces.CompetitieDao;
import dao.interfaces.LidDao;
import dao.interfaces.Manager;
import dao.interfaces.VeldDao;

public class ConcreteManager implements Manager {

	private static ConcreteManager instance;
	private VeldDao vDao;
	private CompetitieDao cmpDao;
	private ClubhuisDao chDao;
	private LidDao lDao;

	private ConcreteManager() {
		vDao = VeldDaoMock.getInstance();
		cmpDao = CompetitieDaoMock.getInstance();
		chDao = ClubhuisDaoMock.getInstance();
		lDao = LidDaoMock.getInstance();
	}

	public static ConcreteManager getInstance() {
		if (instance == null) {
			instance = new ConcreteManager();
		}
		return instance;
	}

	@Override
	public VeldDao getVeldDao() {
		return vDao;
	}

	@Override
	public CompetitieDao getCompetitieDao() {
		return cmpDao;
	}

	@Override
	public LidDao getLidDao() {
		return lDao;
	}

	@Override
	public ClubhuisDao getClubhuisDao() {
		return chDao;
	}

	@Override
	public void addLid(String naam, int leeftijd, String adres) {
		lDao.addLid(naam, leeftijd, adres);

	}

	@Override
	public void veranderLid(String oudeNaam, String naam, int leeftijd,
			String adres) {
		lDao.veranderLid(oudeNaam, naam, leeftijd, adres);
	}

	@Override
	public void verwijderLid(String naam) {
		lDao.verwijderLid(naam);
	}

	@Override
	public ArrayList<Lid> getLedenlijst() {
		return lDao.getLedenlijst();
	}

	@Override
	public ArrayList<Lid> getActieveLeden() {
		return lDao.getActieveLeden();
	}

	@Override
	public ArrayList<Lid> getRustendeLeden() {
		return lDao.getRustendeLeden();
	}

	@Override
	public void veranderLidmaatschap(String naam, String lidmaatschap) {
		Lid lid = getLid(naam);
		Lidmaatschap lms = null;
		if (lidmaatschap.equalsIgnoreCase("volwassen")) {
			lms = new Volwassen();
		} else if (lidmaatschap.equalsIgnoreCase("kind")) {
			lms = new Kind();
		} else {
			lms = new Rustend();
		}
		lDao.veranderLidmaatschap(lid, lms);
	}

	@Override
	public void koopArtikel(String naam, int soort) {
		Lid lid = getLid(naam);
		lDao.koopArtikel(lid, soort);
	}

	@Override
	public String getAankoopGeschiedenis(String naam) {
		Lid lid = getLid(naam);
		return lDao.getAankoopGeschiedenis(lid);
	}

	@Override
	public void meldLidAf(String lidNaam) {
		Lid lid = getLid(lidNaam);
		lDao.meldLidAf(lid);
	}

	@Override
	public void reserveerVeld(int veldNr, String lidNaam) {
		Lid lid = getLid(lidNaam);
		vDao.reserveerVeld(veldNr, lid);
	}

	@Override
	public void addVeld() {
		vDao.addVeld();
	}

	@Override
	public ArrayList<Veld> getOverzichtVanVelden() {
		return vDao.getOverzichtVanVelden();
	}

	@Override
	public void addNieuweCompetitie(String competitieNaam) {
		Competitie cmp = new Competitie(competitieNaam);
		cmpDao.addNieuweCompetitie(cmp);
	}

	@Override
	public void addNieuwTeam(String teamNaam) {
		Team team = new Team(teamNaam);
		cmpDao.addNieuwTeam(team);
	}

	@Override
	public void addTeamAanCompetitie(String teamNaam, String competitieNaam) {
		Team team = getTeam(teamNaam);
		Competitie cmp = getCompetitie(competitieNaam);
		cmpDao.addTeamAanCompetitie(team, cmp);
	}

	@Override
	public void verwijderTeamUitCompetitie(String teamNaam,
			String competitieNaam) {
		Team team = getTeam(teamNaam);
		Competitie cmp = getCompetitie(competitieNaam);
		cmpDao.verwijderTeamUitCompetitie(team, cmp);
	}

	@Override
	public void addLidAanTeam(String naam, String teamNaam) {
		Lid lid = getLid(naam);
		Team team = getTeam(teamNaam);
		cmpDao.addLidAanTeam(lid, team);
	}

	@Override
	public void verwijderLidUitTeam(String naam, String teamNaam) {
		Lid lid = getLid(naam);
		Team team = getTeam(teamNaam);
		cmpDao.verwijderLidUitTeam(lid, team);
	}

	@Override
	public void AddTeamAanWedstrijd(String teamNaam, int wedstrijdNr) {
		Team team = getTeam(teamNaam);
		Wedstrijd wedstrijd = getWedstrijd(wedstrijdNr);
		cmpDao.AddTeamAanWedstrijd(team, wedstrijd);
	}

	@Override
	public void addWedstrijdAanCompetitie(int wedstrijdNr, String competitieNaam) {
		Wedstrijd wedstrijd = getWedstrijd(wedstrijdNr);
		Competitie cmp = getCompetitie(competitieNaam);
		cmpDao.addWedstrijdAanCompetitie(wedstrijd, cmp);
	}

	@Override
	public void addUitslagAanWedstrijd(int wedstrijdNr, int thuis, int uit) {
		Wedstrijd wedstrijd = getWedstrijd(wedstrijdNr);
		if (wedstrijd != null)
			wedstrijd.setUitslag(thuis, uit);
	}

	@Override
	public String getStandVanCompetitie(String competitieNaam) {
		return cmpDao.getStandVanCompetitie(competitieNaam);
	}

	@Override
	public String getWedstrijdGeschiedenis(String naam) {
		Lid lid = getLid(naam);
		return cmpDao.getWedstrijdGeschiedenis(lid);
	}

	@Override
	public String getWedstrijdOverzichtVanHuidigeWeek() {
		return cmpDao.getWedstrijdOverzichtVanVolgendeWeek();
	}

	@Override
	public String getWedstrijdOverzichtVanVolgendeWeek() {
		return cmpDao.getWedstrijdOverzichtVanVolgendeWeek();
	}

	@Override
	public void addRekening(String omschrijving, double bedrag) {
		chDao.addRekening(omschrijving, bedrag);
	}

	@Override
	public void betaalRekening(String omschrijving) {
		chDao.betaalRekening(omschrijving);
	}

	@Override
	public ArrayList<Rekening> getOpenstaandeRekeningen() {
		return chDao.getOpenstaandeRekeningen();
	}

	@Override
	public String getFinancieelOverzicht() {
		return chDao.getFinancieelOverzicht();
	}

	@Override
	public void veranderPrijsVanArtikel(double prijs, int artikelNr) {
		chDao.veranderPrijsVanArtikel(prijs, artikelNr);
	}

	@Override
	public void voegArtikelToe(int soort) {
		chDao.voegArtikelToe(soort);
	}

	@Override
	public void verwijderArtikel(int soort) {
		chDao.verwijderArtikel(soort);
	}

	@Override
	public ArrayList<Artikel> getArtikelen() {
		return chDao.getArtikelen();
	}

	@Override
	public Lid getLid(String naam) {
		return lDao.getLid(naam);
	}

	@Override
	public Wedstrijd getWedstrijd(int wedstrijdNr) {
		return cmpDao.getWedstrijd(wedstrijdNr);
	}

	@Override
	public Team getTeam(String teamNaam) {
		return cmpDao.getTeam(teamNaam);
	}

	@Override
	public Competitie getCompetitie(String competitieNaam) {
		return cmpDao.getCompetitie(competitieNaam);
	}

	@Override
	public Veld getVeld(int veldNr) {
		return vDao.getVeld(veldNr);
	}

	@Override
	public double getSaldo() {
		return chDao.getSaldo();
	}

	@Override
	public void getContributie() {
		chDao.updateSaldo(lDao.getContributie());
	}

	@Override
	public void setVeldVrij(int veldNr) {
		vDao.setVeldVrij(veldNr);
	}

	@Override
	public ArrayList<Team> getTeams() {
		// TODO Auto-generated method stub
		return cmpDao.getTeams();
	}

	@Override
	public ArrayList<Competitie> getCompetities() {
		// TODO Auto-generated method stub
		return cmpDao.getCompetities();
	}

}
